package com.example.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.example.utils.LoginInterceptor;
import com.example.utils.RefreshTokenInterceptor;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 注册拦截器
 * 默认情况下（不设定拦截器顺序），preHandle 方法执行顺序与拦截器注册时顺序一致，postHandle 和 afterCompletion 方法执行顺序反之；
 * 如果我们给每个拦截器设定 order ，则 preHandle 方法执行顺序是按照 order 升序执行，postHandle 和 afterCompletion 方法执行顺序反之。
 */
@Configuration
public class MvcConfig implements WebMvcConfigurer {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private MybatisConfig mybatisConfig;

    @Autowired
    private MybatisPlusInterceptor mybatisPlusInterceptor;

    /**
     * Spring Boot默认没有拦截器的自动配置，所以需要在配置类中进行注册。
     * 你需要实现WebMvcConfigurer接口，并重写addInterceptors方法来注册你的拦截器。
     *
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 登录拦截器
        /**
         * 第二层拦截器
         */
        registry.addInterceptor(new LoginInterceptor()).excludePathPatterns(
                "/shop/**",
                "/voucher/**",
                "/shop-type/**",
                "/upload/**",
                "/blog/hot",
                "/user/code",
                "/user/login"
        ).order(1);
        // 默认拦截所有
        // token刷新的拦截器
        /**
         * 第一层拦截器
         */
        registry.addInterceptor(new RefreshTokenInterceptor(stringRedisTemplate)).
                addPathPatterns("/**").
                order(0);
    }

}
